#include "inc.h"
#include "log.h"

void taskMain()
{
    while(1)
    {
        printf( "***总控单元****\n" );
        logWrite( "***总控单元****\n" );
        sleep(1);
    }
}

void taskGetPic()
{
    while(1)
    {
        printf( "  拍摄图像...\n" );
        logWrite( "  拍摄图像...\n" );
        sleep(1);
    }
}

void taskSendPic()
{
    while(1)
    {
        printf( "  发送图像...\n" );
        logWrite( "  发送图像...\n" );
        sleep(1);
    }
}

void taskGetCtl()
{
    while(1)
    {
        printf( "  获取指令...\n" );
        logWrite( "  获取指令...\n" );
        sleep(1);
    }
}

void taskDoCtl()
{
    while(1)
    {
        printf( "  执行指令...\n" );
        logWrite( "  执行指令...\n" );
        sleep(1);
    }
}

int main(int argc, char const *argv[])
{
    pid_t pid;
    int i;
    for( i = 0; i < 4; i++ )
    {
        pid = fork();
        if( pid > 0 )
        {
            printf( "Parent Proccess, pid = %d\n", getpid() );
            logWrite( "Parent Proccess\n" );
        }
        else if ( 0 == pid )
        { 
            printf( "Son    Proccess, pid = %d\n", getpid() );
            logWrite( "Son    Proccess\n" );
            break;                            // break 使得子进程不再创建新的子进程
        }
    }

    if( pid > 0 )
    {
        taskMain();
    }
    else if( 0 == pid)
    {
        sleep(1);

        switch (i)
        {
            case 0: taskGetPic();  break;
            case 1: taskSendPic(); break;
            case 2: taskGetCtl();  break;
            case 3: taskDoCtl();   break;
        }
    }


    return 0;
}


/*
程序功能
    父进程创建 4 个子进程
    父进程作为主控进程, 四个子进程分别完成各自的功能.

涉及函数
    fork

知识要点
    创建多个子进程的典型原子操作.
    包括父进程和4个子进程, 每个进程有自己的无限循环
    在创建子进程的 for 循环中, 如果判断是 子进程, 则直接 break , 退出循环.
    在接下来的 switch 中, 根据此时的 i 值, 来判断属于哪个子进程, 启动不同的子任务.

    命令 ps -aux | grep a.out
    如果没有加 sleep(1), 可以看到 a.out的状态为 R+, 前台在运行状态的进程
    如果   加 sleep(1), 可以看到 a.out的状态为 S+, 表示这是一个前台休眠状态的进程

    命令 pstree -sp pid
    查看进程树
    


*/